#include <stdio.h>
#include <stdlib.h>

int main() {
    // 指针简单来说就是存储内存地址的变量

    int a = 100;
    int b = 200;

    // 指针的定义, 一个存储变量 a 的地址, 一个存储变量 b 的地址
    int *p_01 = &a;
    int *p_02 = &b;

    // 通过 *p 实现对内存地址的操作
    printf("a = %d b = %d\n", a, b);    // 100 200
    *p_01 = 300;
    *p_02 = 400;
    printf("a = %d b = %d\n", a, b);    // 300 400
    printf("\n");

    // 不同类型的指针的步长也是不一样的

    char *_char_type = NULL;
    short *_shore_type = NULL;
    int *_int_type = NULL;

    int value_number_01 = 1000;
    _char_type = &value_number_01;
    _shore_type = &value_number_01;
    _int_type = &value_number_01;

    printf("_char_type = %p\n", _char_type);
    printf("_char_type + 1 = %p\n", _char_type + 1);    // 地址差 1
    printf("_shore_type = %p\n", _shore_type);
    printf("_shore_type + 1= %p\n", _shore_type + 1);   // 地址差 2
    printf("_int_type = %p\n", _int_type);
    printf("_int_type + 1 = %p\n", _int_type + 1);      // 地址差 3
    printf("\n");

    // NULL 等效于 0
    printf("NULL = %d\n", NULL);    // 0
    printf("\n");

    // void * 为万能指针, 可以保存任意的地址
    int value_number_02 = 200;
    void *p = &value_number_02;
    // printf("value_number_02%d", *p); // 错误的输出, 不能输出 void 类型的变量
    printf("value_number_02 = %d\n", *(int *) p); // 正确的输出, 需要将类型为 void * 变量 转为 int * 的变量在输出

    return 0;
}